﻿using System;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Collections.Generic;
using Bovespa.Infra.Data;
using Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades;

namespace Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Dados
{
    /// <summary>
    /// Fornece operacoes de acesso a dados para a entidade de negocio "Produto".
    /// </summary>
    public class Produto
    {
        #region Campos

        private int aplicacaoID = -1; //Id do Sistema

        #endregion

        #region Properties

        private int AplicacaoID
        {
            get
            {
                if (-1 == aplicacaoID)
                {
                    System.Configuration.AppSettingsReader reader = new System.Configuration.AppSettingsReader();
                    aplicacaoID = (int)reader.GetValue("ApplicationInfraID", typeof(int));
                }
                return aplicacaoID;
            }
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Recupera uma lista de entidades de negocio "Produto" do banco de dados.
        /// </summary>
        public List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> ConsultarProduto()
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> listaProduto = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto>();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_PRODUTO");

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto = new Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto();

                    int codigoIndice = dados.GetOrdinal("CD_PRODUTO");
                    produto.Codigo = dados.GetInt32(codigoIndice);

                    int codigoPaiIndice = dados.GetOrdinal("CD_PRODUTO_PAI");
                    if (!dados.IsDBNull(codigoPaiIndice))
                    {
                        produto.CodigoPai = dados.GetInt32(codigoPaiIndice);
                    }

                    int nomeIndice = dados.GetOrdinal("NM_PRODUTO");
                    produto.Nome = dados.GetString(nomeIndice);

                    listaProduto.Add(produto);
                }
            }
            return listaProduto;
        }

        /// <summary>
        /// Recupera uma lista de entidades de negocio "Produto" por hierarquia do banco de dados.
        /// </summary>
        public List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> ConsultarProdutoPorHierarquia()
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> listaProduto = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto>();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_PRODUTO_HIERARQUIA");

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto = new Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto();

                    int codigoIndice = dados.GetOrdinal("Codigo");
                    produto.Codigo = dados.GetInt32(codigoIndice);

                    int nomeIndice = dados.GetOrdinal("Nome");
                    produto.Nome = !dados.IsDBNull(nomeIndice) ? dados.GetString(nomeIndice) : null;

                    listaProduto.Add(produto);
                }
            }
            return listaProduto;
        }

        /// <summary>
        /// Recupera uma entidade de negocio "Produto" do banco de dados.
        /// </summary>
        public Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto ObterProduto(int id)
        {
            Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto = new Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_PRODUTO_POR_PK");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, id);

            using (IDataReader dados = conexao.ExecuteReader())
            {
                if (dados.Read())
                {
                    int codigoIndice = dados.GetOrdinal("CD_PRODUTO");
                    produto.Codigo = dados.GetInt32(codigoIndice);

                    int codigoPaiIndice = dados.GetOrdinal("CD_PRODUTO_PAI");
                    if (!dados.IsDBNull(codigoPaiIndice))
                    {
                        produto.CodigoPai = dados.GetInt32(codigoPaiIndice);
                    }

                    int nomeIndice = dados.GetOrdinal("NM_PRODUTO");
                    produto.Nome = dados.GetString(nomeIndice);

                }
            }
            return produto;
        }

        /// <summary>
        /// Recupera uma entidade de negocio "Produto" do banco de dados.
        /// </summary>
        /*public List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> ConsultarProduto(int id)
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto> listaProduto = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto>();

            SqlDatabase conexao = new SqlDatabase(_idAplicacao);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_PRODUTO_POR_FK");
            conexao.AddInParameter("P_CD_PRODUTO_PAI", DbType.Int32, id);

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto = new Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto();
                    int codigoIndice = dados.GetOrdinal("CD_PRODUTO");
                    produto.Codigo = dados.GetInt32(codigoIndice);

                    int codigoPaiIndice = dados.GetOrdinal("CD_PRODUTO_PAI");
                    if (!dados.IsDBNull(codigoPaiIndice))
                    {
                        produto.CodigoPai = dados.GetInt32(codigoPaiIndice);
                    }

                    int nomeIndice = dados.GetOrdinal("NM_PRODUTO");
                    produto.Nome = dados.GetString(nomeIndice);

                    listaProduto.Add(produto);
                }
            }
            return listaProduto;
        }*/

        /// <summary>
        /// Persiste uma entidade de negocio "Produto" no banco de dados.
        /// </summary>
        public void InserirProduto(Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_IN_TB_PRODUTO");
            if (produto.CodigoPai != null)
                conexao.AddInParameter("P_CD_PRODUTO_PAI", DbType.Int32, produto.CodigoPai);
            else
                conexao.AddInParameter("P_CD_PRODUTO_PAI", DbType.Int32, null);

            if (produto.Nome != null)
            {
                conexao.AddInParameter("P_NM_PRODUTO", DbType.String, produto.Nome);
            }
            conexao.AddOutParameter("P_CD_PRODUTO_RET", DbType.Int32, 4);

            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Remove uma entidade de negocio "Produto" do banco de dados.
        /// </summary>
        public void ExcluirProduto(int id)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_DL_TB_PRODUTO");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, id);
            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Atualiza uma entidade de negocio "Produto" no banco de dados.
        /// </summary>
        public void AtualizarProduto(Bovespa.Sinacor.Servico.BaseConhecimento.Produto.Entidades.Produto produto)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_UP_TB_PRODUTO");
            conexao.AddInParameter("P_CD_PRODUTO", DbType.Int32, produto.Codigo);
            if (produto.CodigoPai != null)
            {
                conexao.AddInParameter("P_CD_PRODUTO_PAI", DbType.Int32, produto.CodigoPai);
            }
            if (produto.Nome != null)
            {
                conexao.AddInParameter("P_NM_PRODUTO", DbType.String, produto.Nome);
            }
            conexao.ExecuteNonQuery();
        }

        #endregion
    }
}

